//
//  KSDPlaceholderTextView.m
//  KSuodun
//
//  Created by DwZeng on 2022/7/18.
//

#import "KSDPlaceholderTextView.h"
@interface KSDPlaceholderTextView()
/** 占位文字控件 */
@property (strong ,nonatomic)UILabel *placeholderLabel;
@end
@implementation KSDPlaceholderTextView
- (UILabel *)placeholderLabel
{
    if (_placeholderLabel == nil)
    {
        //先添加是为了在使用set方法的时候，可以直接将颜色添加进去
        _placeholderLabel = [[UILabel alloc] init];
        _placeholderLabel.x = 10;
        _placeholderLabel.y = 7;
        _placeholderLabel.numberOfLines = 0;

        //        _placeholderLabel.backgroundColor = [UIColor redColor];
        [self addSubview:_placeholderLabel];
    }
    return _placeholderLabel;
}
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        //设置在垂直方向永远可以滚动
        self.alwaysBounceVertical = YES;
        
        self.font = [UIFont systemFontOfSize:15];
        //避免用户不设置的时候给他一个默认的颜色
        self.placeholderCloor = [UIColor lightGrayColor];
        //监听文字的改变
        [KSDNotification addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:nil];
    }
    return self;
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    
    self.placeholderLabel.width = self.frame.size.width - 2 * self.placeholderLabel.x;
    [self.placeholderLabel sizeToFit];
}
#pragma - mark - 监听文字的改变的通知
- (void)textDidChange
{
    //调用重绘的方法
    //    [self setNeedsDisplay];
    //只要有文字就隐藏
    self.placeholderLabel.hidden = self.hasText;
}
#pragma - mark - 画占位文字的方法
//- (void)drawRect:(CGRect)rect
//{
//    //使用drawRect实现占位文字的时候当我拖拽的时候文字不会跟着一起动  所以这个方法实现的方法是文字是不会动的；所以要实现是文字跟着已启动的效果只能添加label来实现；所以这个方法暂时不可用
//
//
//    //如果有占位文字就返回;不绘制占位文字
////    if (self.text.length || self.attributedText.length)
////    {
////        return;
////    }
//    //是否有文字
//    if (self.hasText)
//    {
//        return;
//    }
//    rect.origin.x = 4;
//    rect.origin.y = 7;
//    rect.size.width -= 2 * rect.origin.x;
//    [self.placeholder drawInRect:rect withAttributes:@{NSFontAttributeName : self.font,
//                                                       NSForegroundColorAttributeName : self.placeholderCloor}];
//}
#pragma - mark - 计算placeholderLabel的size(在这地方设置的时候当一开始的时候就给self.width == 200  的时候  这个时候计算的文字的高度就会有问题  所以这个方法计算的时候是会有问题的)
- (void)updatePlaceholderLabelSize
{
    //方法一
    //    self.placeholderLabel.size = [self.placeholder boundingRectWithSize:CGSizeMake(ScreenWidth - 2 * self.placeholderLabel.x, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.font} context:nil].size;
    
    //方法二
    self.placeholderLabel.width = SCREEN_WIDTH - 2 * self.placeholderLabel.x;
    [self.placeholderLabel sizeToFit];
}
#pragma - mark - 每次当颜色发生变的时候重新绘制
- (void)setPlaceholderCloor:(UIColor *)placeholderCloor
{
    _placeholderCloor = placeholderCloor;
    //    [self setNeedsDisplay];
    
    self.placeholderLabel.textColor = placeholderCloor;
}

- (void)setPlaceholderFont:(UIFont *)placeholderFont{
    _placeholderFont = placeholderFont;
    self.placeholderLabel.font = placeholderFont;
}
#pragma - mark - 每次当占位文字发生变的时候重新绘制
- (void)setPlaceholder:(NSString *)placeholder
{
    _placeholder = placeholder;
    //    [self setNeedsDisplay];
    
    self.placeholderLabel.text = placeholder;
    
    //    [self updatePlaceholderLabelSize];
    [self setNeedsLayout];
    
}
#pragma - mark - 每次当占位文字的字体发生变的时候重新绘制
- (void)setFont:(UIFont *)font
{
    [super setFont:font];
    //    [self setNeedsDisplay];
    
//    self.placeholderLabel.font = font;
    
    //    [self updatePlaceholderLabelSize];
    [self setNeedsLayout];
}
#pragma - mark - 每次文字的字体发生变的时候重新绘制(代码修改文字的bug)
- (void)setText:(NSString *)text
{
    [super setText:text];
    //    [self setNeedsDisplay];
    
    [self textDidChange];
}
#pragma - mark - 每次文字的字体发生变的时候重新绘制(代码修改文字的bug)
- (void)setAttributedText:(NSAttributedString *)attributedText
{
    [super setAttributedText:attributedText];
    //    [self setNeedsDisplay];
    
    [self textDidChange];
}

/**
 *  setNeedsLayout方法 :会在恰当的时候调用layoutSubviews的方法
 *  setNeedsDisplay方法:会在恰当的时候调用drawRect:的方法
 */


- (void)dealloc
{
    [KSDNotification removeObserver:self];
}
@end
